
#include "percep.h"
/************************************************
Se comenta debido a que las librerias se encuentran incluidas en funciones.h
#include <stdlib.h>
#include <iostream>
using namespace std;
*************************************************/

void menu();

int main(int argc, char **argv)
{
    int opc, entradas, tipo;
    double **entra;
    char nombre[32];
    perceptron *neurona = NULL;
    do
    {
        menu();
        scanf("%i", &opc);
        switch(opc)
        {
            case 1:
            cout<<"Ingrese la cantidad de entradas:"<<endl;
            cin>>entradas;
            cout<<"Ingrese el tipo de neurona:"<<endl;
            cout<<"\t 0 - Para Funcion Lineal  "<<endl;
            cout<<"\t 1 - Para Funcion Sigmoidea "<<endl;
            cout<<"\t 2 - Para Funcion Signo "<<endl;
            cout<<"\t 3 - Para Funcion Gaussiana "<<endl;
            cin>>tipo;
            cout<<"Ingrese el factor de aprendizaje"<<endl;
            double factor;
            cin>>factor;
            neurona = new perceptron(tipo,entradas, factor);
            break;
            case 2:
            int cases;
            cout<<"Ingrese la cantidad de casos:";
            cin>>cases;
            int j;
            entra = new double*[cases];
            for(int i = 0; i<cases; i++)
            {
                entra[i] = new double[entradas+1];
                cout<<"Ingrese el caso numero "<<i<<" :";

                for(j = 0; j<entradas; j++)
                {
                    cout<<"Ingrese la entrada "<<j<<":";
                    cin>>entra[i][j];
                }
                cout<<"Ingrese la salida esperada :";
                cin>>entra[i][j];
            }
            //mostrar_matriz(entra, cases, entradas+1);
            neurona->entrenar(entra, cases);
            cout<< "Desea guardar en un archivo los datos del entrenamiento para luego volver a cargarlos?"<<endl;
            cout<< "1 = SI \t 0 = NO"<<endl;
            int guardar;
            cin>>guardar;
            if(guardar==1)
            {
                cout<< "Ingrese el nombre del archivo:  ";
                char nombre[32];
                cin.width(31);
                cin>>nombre;
                neurona->guardar_patrones(nombre, cases, entra);
            }

            cout << "Desea guardar la red entrenada? 1 = SI / 0 = NO"<<endl;
            cin>>guardar;
            if(guardar==1)
            {
                cout<< "Ingrese el nombre del archivo:  ";
                char nombre[32];
                cin.width(31);
                cin>>nombre;
                neurona->guardar_red(nombre, 1);
            }

            delete [] entra;
            break;
            case 3:
            cout<< "Ingrese el nombre del archivo:  ";
            cin.width(31);
            cin>>nombre;
            int casos;
            entra = neurona->cargar_patrones(nombre, &casos);
            if(entra!=NULL)
            {
                neurona->entrenar(entra, casos);
                delete [] entra;
            }
            break;
            case 4:
            double *val, salida;
            val = new double[entradas];
            for(int i = 0; i<entradas; i++)
            {
                cout<<"Ingrese la entrada "<<i<<" :";
                cin>>val[i];
            }
            salida = neurona->respuesta(val);
            cout<< "La salida de la neurona es :"<<salida<<endl;
            break;
            case 5:
            cout<<"Nombre del archivo donde esta la configuracion : ";
            cin.width(31);
            cin>>nombre;
            neurona = new perceptron(nombre);
            entradas = neurona->get_cant_entradas();
            break;
            case 6:
            cout<< "Ingrese el nombre del archivo:  ";
            cin>>nombre;
            neurona->guardar_red(nombre, 1);
            break;
            case 0:
            if(neurona !=NULL)
            delete neurona;
            break;
            default:
            cout <<"Opcion invalida"<<endl;
        }
    }while(opc!=0);

    return 0;
}

void menu()
{
    cout<<"*************************************************************"<<endl;
    cout<<"*\t Programa para utilizar un perceptron simple \t    *"<<endl;
    cout<<"*\t Hecho por Schmidt Brian \t\t            *"<<endl;
    cout<<"*************************************************************"<<endl<<endl;
    cout<< "\tIngrese una opcion:"<<endl;
    cout<< "\t\t1 - Para crear perceptron"<<endl;
    cout<< "\t\t2 - Para entrenar la red por ingreso manual"<<endl;
    cout<< "\t\t3 - Para entrenar la red desde un archivo"<<endl;
    cout<< "\t\t4 - Para ejecutar"<<endl;
    cout<< "\t\t5 - Para cargar la red desde un archivo"<<endl;
    cout<< "\t\t6 - Para guardar la red a un archivo"<<endl;
    cout<< "\t\t0 - Para salir"<<endl;
}


